//---------------------------------------------------------------------------
#pragma hdrstop
#include "classeListaCircularDuplamenteLigada.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)

ListaCDL::ListaCDL()
{
	inicio = NULL;
	final = NULL;
	Tamanho = 0;
	Posicao_Atual = 0;
}
//---------------------------------------------------------------------------
ListaCDL::~ListaCDL()
{
	limpar();
	Tamanho = 0;
	Posicao_Atual=0;
}
//---------------------------------------------------------------------------
void ListaCDL::insereInicio(String n)
{
	Posicao_Atual=1;
	insereX(n, 0);
}
//---------------------------------------------------------------------------
void ListaCDL::insereX(String x, int posicao)
{
	No * novo = new No();
	if (inicio==NULL)
	{
		inicio = novo;
		final = novo;
		novo->setvalor(x);
		novo->setProximo(novo);
		novo->setAnterior(novo);
	}
	else
	{
		No * noatual = inicio;
		if (posicao > Tamanho)
		{
			noatual = final;
		}
		else
		{
			int aux = 0;
			while (aux++ < posicao)
			{
				noatual = noatual->getProximo();
			}
		}
		novo->setvalor(x);
		novo->setProximo(noatual);
		novo->setAnterior(noatual->getAnterior());
		noatual->setAnterior(novo);
		novo->getAnterior()->setProximo(novo);
		if (posicao == 0)
		{
			inicio = novo;
		}
		else if (posicao>=Tamanho)
		{
			final = novo;
		}

	}
	if((Posicao_Atual==1)&&(Tamanho==0))
	{
    	Posicao_Atual=1;
	}
	else{
		Posicao_Atual = posicao+1;
	}

	Tamanho++;

}
//---------------------------------------------------------------------------
void ListaCDL::insereFinal(String f)
{
	Posicao_Atual = Tamanho;
	insereX(f, Tamanho);
}
//---------------------------------------------------------------------------
String ListaCDL::consultaInicio()
{
	No * noatual = inicio;
	if (inicio != NULL)
	{
		Posicao_Atual = 1;
		return noatual->getvalor();
	}
	else
	{
		Posicao_Atual = Tamanho;
		return 0;
	}
}
//---------------------------------------------------------------------------
String ListaCDL::consultaX(int posicao)
{
	No * noatual = inicio;
	if (inicio == NULL)
	{
		return 0;
	}
	int aux = 0;
	while (aux++ < posicao-1)
	{
		noatual = noatual->getProximo();
	}

	if(Tamanho==1)
	{
		Posicao_Atual=Tamanho;
	}
	else
	{
		if(Tamanho==0)
		{
			Posicao_Atual=0;
		}
		else{
			Posicao_Atual = posicao;
		}
	}
	return noatual->getvalor();
}
//---------------------------------------------------------------------------
String ListaCDL::consultaAtual()
{
	return consultaX(Posicao_Atual);
}
//---------------------------------------------------------------------------
String ListaCDL::consultaFinal()
{
	No * noatual = final;
	if (final != NULL)
	{
		Posicao_Atual = Tamanho;
		return noatual->getvalor();
	}

	Posicao_Atual = Tamanho;
	return 0;
}
//---------------------------------------------------------------------------
String ListaCDL::consultaAnterior()
{
	No * noatual = inicio;
	if (inicio == NULL)
	{
		return 0;
	}
	int aux = 0;
	while (aux++ < Posicao_Atual-1)
	{
		noatual = noatual->getProximo();
	}
	if (Posicao_Atual == 1) {
		Posicao_Atual = Tamanho;
	}
	else
	{
		Posicao_Atual = Posicao_Atual-1;
	}

	return (noatual->getAnterior())->getvalor();

}
//---------------------------------------------------------------------------
String ListaCDL::consultaProximo()
{
	No * noatual = inicio;
	if (inicio == NULL)
	{
		return 0;
	}
	int aux = 0;
	while (aux++ < Posicao_Atual-1)
	{
		noatual = noatual->getProximo();
	}

	if (Posicao_Atual == Tamanho)
	{
		Posicao_Atual = 1;
	}
	else
	{
		Posicao_Atual = Posicao_Atual+1;
	}

	return (noatual->getProximo())->getvalor();
}
//---------------------------------------------------------------------------
void ListaCDL::removeInicio()
{
	Posicao_Atual = 1;
	removeX(0);
}
//---------------------------------------------------------------------------
void ListaCDL::removeX(int posicao)
{
	if (inicio==NULL)
	{
		return;
	}
	if (posicao<0 || posicao>=Tamanho) {
		return;
	}
	No * noatual = inicio;
	int aux = 0;
	while (aux++ < posicao)
	{
		noatual = noatual->getProximo();
	}
	if (Tamanho>1)
	{
		noatual->getAnterior()->setProximo(noatual->getProximo());
		noatual->getProximo()->setAnterior(noatual->getAnterior());
		if (inicio==noatual) {
			inicio = noatual->getProximo();
		}
		if (final==noatual) {
			final = noatual->getAnterior();
		}
	}
	else
	{
		inicio = NULL;
		final = NULL;
	}
	noatual->setProximo(NULL);
	delete noatual;
	Tamanho--;

	if(Posicao_Atual!=1)
	{
		if(Posicao_Atual==Tamanho+1)
		{
			Posicao_Atual = Tamanho;
		}
		else
		{
			Posicao_Atual = Posicao_Atual-1;
		}
	}
}
//---------------------------------------------------------------------------
void ListaCDL::removeFinal()
{
	Posicao_Atual = Tamanho;
	removeX(Tamanho);
}
//---------------------------------------------------------------------------
void ListaCDL::limpar()
{
	//percorrer a lista dando delete e NULL no final
	if (inicio==NULL)
	{
		return;
	}
	final->setProximo(NULL);
	delete inicio;
	inicio = NULL;
	final = NULL;
	Posicao_Atual = 1;
	Tamanho = 0;
}
//---------------------------------------------------------------------------
int ListaCDL::getTamanho()
{
	return Tamanho;
}
//---------------------------------------------------------------------------
int ListaCDL::getPosicao_Atual()
{
	return Posicao_Atual;
}
//---------------------------------------------------------------------------
void ListaCDL::listar(TStrings *itens)
{
	itens->Clear();
	No *sel = inicio;
	for (int i=0; i < Tamanho; i++)
	{
		itens->Append(sel->getvalor());
		sel = sel->getProximo();
	}
}
//---------------------------------------------------------------------------
void ListaCDL::altera(String v)
{
	No *sel = inicio;
	for (int i=0; i < Posicao_Atual; i++)
	{
		sel = sel->getProximo();
	}
	sel->setvalor(v);
}
//---------------------------------------------------------------------------
void ListaCDL::removeFaixa(int min, int max)
{
	No *it = inicio;
	int v;
	for (int i=0; i < Tamanho; i++)
	{
		v = StrToInt(it->getvalor());
		it = it->getProximo();
		if (v >= min && v <= max)
		{
			removeX(i);
			i--;
		}
	}
}
//----------------------------------------------
void ListaCDL::remove(String v)
{
	No *it = inicio;
	for (int i=0; i < Tamanho; i++)
	{
		if (it->getvalor()==v)
		{
			removeX(i);
			return;
		}
		it = it->getProximo();
	}
}
//-------------------------------------------------------------------
   String ListaCDL::consultaMin()
{

	No * noatual = new No();

	if (inicio == NULL)
	{
		return 0;
	}

	int aux = 0;
	while (aux++ < Tamanho)
	{
		if(noatual > noatual->getProximo())
		{
			noatual = noatual->getProximo();
		}

	}
	return noatual->getvalor();

}
//---------------------------------------------------------------------------
String ListaCDL::consultaMax()
{
	No * noatual = new No();

	if (inicio == NULL)
	{
		return 0;
	}

	int aux = 0;
	while (aux++ < Tamanho)
	{
		if(noatual < noatual->getProximo())
		{
			noatual = noatual->getProximo();
		}

	}

	return noatual->getvalor();
}
//---------------------------------------------------------------------------
String ListaCDL::buscaValor(String v)
{
	No *it = inicio;
	for (int i=0; i < Tamanho; i++)
	{
		if (it->getvalor() == v)
		{
			return "ok";
		}
		it = it->getProximo();
	}
	return "shit";
}
